using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
    using System.Text;
	#endregion

	public partial class FrmLapTuyenXe : Office2007Form
	{
		public EventHandler Handler { get; set; }
		private DataTable DataSource;
		private int MaTuyenXe;

		public FrmLapTuyenXe(int matuyenxe = -1)
		{
			InitializeComponent();
            LoadDiaDiem();
			MaTuyenXe = matuyenxe;
            btnCapNhatChuyenXe.Enabled = false;
		}

		private void FrmLapTuyenXe_Load(object sender, EventArgs e)
		{
			InitGridView();
			InitDataSource();
			if (MaTuyenXe != -1)
			{
				LoadTuyenXe();
			}
            dtgvData.ClearSelection();
		}

		private void InitGridView()
		{
            DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Mã chuyến xe",
                DataPropertyName = "MaChuyenXe",
                Name = "MaChuyenXe",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 5))
            };
			dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                DataPropertyName = "MaTaiXe",
                Name = "MaTaiXe",
                Width = 1,
                Visible = false
            };
            dtgvData.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Tài xế",
                DataPropertyName = "HoTen",
                Name = "HoTen",
                Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth) * ((double)1 / 5))
            };
            dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Mã BS Xe",
				DataPropertyName = "MaBSXe",
				Name = "MaBSXe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Giờ khởi hành",
				DataPropertyName = "GioKhoiHanh",
				Name = "GioKhoiHanh",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Đơn giá",
				DataPropertyName = "DonGia",
				Name = "DonGia",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5)) - 1
			};
			dtgvData.Columns.Add(objColumn);
		}

		public void InitDataSource()
		{
			DataSource = new DataTable();
			DataSource.Columns.Add("MaChuyenXe");
			DataSource.Columns.Add("MaTaiXe");
            DataSource.Columns.Add("HoTen");
			DataSource.Columns.Add("MaBSXe");
			DataSource.Columns.Add("GioKhoiHanh");
			DataSource.Columns.Add("DonGia");
			DataView objTimeSheetDV = new System.Data.DataView(DataSource);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

		private void btnChonDiaDiemBatDau_Click(object sender, EventArgs e)
		{
			FrmQuanLyDiaDiem frm = new FrmQuanLyDiaDiem();
			frm.ShowDialog();
		}

		private void btnChonDiaDiemKetThuc_Click(object sender, EventArgs e)
		{
			FrmQuanLyDiaDiem frm = new FrmQuanLyDiaDiem();
			frm.ShowDialog();
		}

		private void btnThem_Click(object sender, EventArgs e)
		{
			FrmCapNhatChuyenXe frm = new FrmCapNhatChuyenXe();
			frm.Handler += GetChuyenXe;
			frm.ShowDialog();
		}

		public void GetChuyenXe(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
            // Format: MaChuyenXe#MaTaiXe#TenTaiXe#MaBSXe#GioKhoiHanh#DonGia
            DataSource.Rows.Add(string.Empty, comp[0], comp[1], comp[2], comp[3], comp[4]);
		}

		private void btnXoa_Click(object sender, EventArgs e)
		{
            if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
            {
                MessageBoxEx.Show("Vui lòng chọn chuyến xe để xóa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            // // Xoa chuyen xe da them tu truoc khoi database
            if (!string.Empty.Equals(DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaChuyenXe"].ToString()))
            {
                if (LichHoatDongRepository.SelectByMaChuyenXe(int.Parse(DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaChuyenXe"].ToString())).Count > 0)
                {
                    MessageBoxEx.Show("Đã lập lịch cho chuyến xe này, nên không được phép xóa", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (ChuyenXeRepository.Delete(int.Parse(DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaChuyenXe"].ToString())))
                {
                    MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    btnCapNhatChuyenXe.Enabled = false;
                }
                else
                    MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // Xoa khoi grid
            DataSource.Rows.RemoveAt(dtgvData.SelectedRows[0].Index);
		}

		private bool ValidateInput(ref string errorText)
		{
            if (cbxDiemBatDau.SelectedIndex == -1)
            {
                errorText = "Vui lòng nhập điểm bắt đầu";
                return false;
            }

            if (cbxDiemKetThuc.SelectedIndex == -1)
            {
                errorText = "Vui lòng nhập điểm kết thúc";
                return false;
            }

            if (cbxDiemKetThuc.SelectedItem.Equals(cbxDiemBatDau.SelectedItem))
            {
                errorText = "Điểm bắt đầu và điểm kết thúc không được trùng nhau";
                return false;
            }

            if (string.Empty.Equals(BuildNgayHoatDong()))
            {
                errorText = "Vui lòng chọn ngày hoạt động";
                return false;
            }

			if (DataSource.Rows.Count == 0)
			{
				errorText = "Danh sách hiện thời không có gì!";
				return false;
			}

			return true;
		}

		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}

            var result = false;

            if (this.MaTuyenXe == -1)
                result = ActionAdd();
            else
                result = ActionUpdate();

            if (result)
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
		}

		private void btnThoat_Click(object sender, EventArgs e)
		{
			this.Close();
		}

        /// <summary>
        /// Build ngay hoat dong
        /// </summary>
        /// <returns>Ex:2,4,6</returns>
        private string BuildNgayHoatDong()
        {
            var ngayHoatDong = new StringBuilder(20);

            if (ckbxThu2.Checked)
                ngayHoatDong.Append("2,");
            if (ckbxThu3.Checked)
                ngayHoatDong.Append("3,");
            if (ckbxThu4.Checked)
                ngayHoatDong.Append("4,");
            if (ckbxThu5.Checked)
                ngayHoatDong.Append("5,");
            if (ckbxThu6.Checked)
                ngayHoatDong.Append("6,");
            if (ckbxThu7.Checked)
                ngayHoatDong.Append("7,");
            if (ckbxCN.Checked)
                ngayHoatDong.Append("cn,");

            var strNgayHoatDong = ngayHoatDong.ToString();
            return string.Empty.Equals(strNgayHoatDong) ? strNgayHoatDong : strNgayHoatDong.Remove(strNgayHoatDong.Length - 1);
        }

        /// <summary>
        /// Ham de add new tuyen xe [Bao gom danh sach cac chuyen xe]
        /// </summary>
        /// <returns></returns>
		private bool ActionAdd()
		{
			try
			{
				DataContext.Instance.Connection.Open();
				using (var transaction = DataContext.Instance.Connection.BeginTransaction())
				{
					var tuyenxe = new TuyenXe
					{
						MaDiemBatDau = ((DiaDiem)cbxDiemBatDau.SelectedItem).MaDiaDiem,
                        MaDiemKetThuc = ((DiaDiem)cbxDiemKetThuc.SelectedItem).MaDiaDiem,
                        NgayHoatDong = BuildNgayHoatDong(),
					};

					if (TuyenXeRepository.Insert(tuyenxe))
					{
						for (int i = 0; i <= DataSource.Rows.Count - 1; i++)
						{
							var chuyenxe = new ChuyenXe
							{
								MaTuyenXe = tuyenxe.MaTuyenXe,
								MaTaiXe = int.Parse(DataSource.Rows[i]["MaTaiXe"].ToString()),
								MaBSXe = DataSource.Rows[i]["MaBSXe"].ToString(),
								GioKhoiHanh = DataSource.Rows[i]["GioKhoiHanh"].ToString(),
								DonGia = long.Parse(DataSource.Rows[i]["DonGia"].ToString().Replace(",", string.Empty).Replace(".", string.Empty)),
							};
							if (!ChuyenXeRepository.Insert(chuyenxe))
							{
								DataContext.Instance.Connection.Close();
								return false;
							}
						}
						transaction.Commit();
					}
					else
					{
						DataContext.Instance.Connection.Close();
						return false;
					}
				}
				DataContext.Instance.Connection.Close();
				return true;
			}
			catch
			{
				DataContext.Instance.Connection.Close();
				return false;
			}
		}

        /// <summary>
        /// Ham de cap nhat tuyen xe 
        /// </summary>
        /// <returns></returns>
        private bool ActionUpdate()
        {
            try
            {
                DataContext.Instance.Connection.Open();
                using (var transaction = DataContext.Instance.Connection.BeginTransaction())
                {
                    var tuyenXe = TuyenXeRepository.SelectByID(this.MaTuyenXe);
                    tuyenXe.MaDiemBatDau = ((DiaDiem)cbxDiemBatDau.SelectedItem).MaDiaDiem;
                    tuyenXe.MaDiemKetThuc = ((DiaDiem)cbxDiemKetThuc.SelectedItem).MaDiaDiem;
                    tuyenXe.NgayHoatDong = BuildNgayHoatDong();

                    // Update successful
                    if (TuyenXeRepository.Save())
                    {
                        for (int i = 0; i < DataSource.Rows.Count; i++)
                        {
                            // Insert new
                            if (string.Empty.Equals(DataSource.Rows[i]["MaChuyenXe"].ToString()))
                            {
                                var chuyenxe = new ChuyenXe
                                {
                                    MaTuyenXe = tuyenXe.MaTuyenXe,
                                    MaTaiXe = int.Parse(DataSource.Rows[i]["MaTaiXe"].ToString()),
                                    MaBSXe = DataSource.Rows[i]["MaBSXe"].ToString(),
                                    GioKhoiHanh = DataSource.Rows[i]["GioKhoiHanh"].ToString(),
                                    DonGia = long.Parse(DataSource.Rows[i]["DonGia"].ToString().Replace(",", string.Empty).Replace(".", string.Empty)),
                                };
                                if (!ChuyenXeRepository.Insert(chuyenxe))
                                {
                                    DataContext.Instance.Connection.Close();
                                    return false;
                                }
                            }
                            else
                            {
                                // Update chuyen xe 
                                var chuyenxe = ChuyenXeRepository.SelectByID(int.Parse(DataSource.Rows[i]["MaChuyenXe"].ToString()));
                                chuyenxe.MaTaiXe = int.Parse(DataSource.Rows[i]["MaTaiXe"].ToString());
                                chuyenxe.MaBSXe = DataSource.Rows[i]["MaBSXe"].ToString();
                                chuyenxe.GioKhoiHanh = DataSource.Rows[i]["GioKhoiHanh"].ToString();
                                chuyenxe.DonGia = long.Parse(DataSource.Rows[i]["DonGia"].ToString().Replace(",", string.Empty).Replace(".", string.Empty));
                                if (!ChuyenXeRepository.Save())
                                {
                                    DataContext.Instance.Connection.Close();
                                    return false;
                                }
                            }
                            
                        }
                        transaction.Commit();
                    }
                    else
                    {
                        DataContext.Instance.Connection.Close();
                        return false;
                    }
                }
                DataContext.Instance.Connection.Close();
                return true;
            }
            catch
            {
                DataContext.Instance.Connection.Close();
                return false;
            }
        }

		private void LoadTuyenXe()
		{
			var tuyenxe = TuyenXeRepository.SelectByID(MaTuyenXe);
			if (tuyenxe != null)
			{
				txtMaTuyenXe.Text = MaTuyenXe.ToString();
                cbxDiemBatDau.SelectedItem = tuyenxe.DiaDiem;
                cbxDiemKetThuc.SelectedItem = tuyenxe.DiaDiem1;
                txtDoDai.Text = tuyenxe.DiaDiem1.DoDai.ToString();

                // Ngay hoat dong
                if (tuyenxe.NgayHoatDong.Contains("2"))
                    ckbxThu2.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("3"))
                    ckbxThu3.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("4"))
                    ckbxThu4.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("5"))
                    ckbxThu5.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("6"))
                    ckbxThu6.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("7"))
                    ckbxThu7.Checked = true;
                if (tuyenxe.NgayHoatDong.Contains("cn"))
                    ckbxCN.Checked = true;

				LoadChuyenXe(tuyenxe);
			}
		}

		private void LoadChuyenXe(TuyenXe tuyenxe)
		{
			var lst = ChuyenXeRepository.SelectByMaTuyenXe(tuyenxe.MaTuyenXe);
			if (lst.Count > 0)
			{
				foreach (var item in lst)
				{
                    DataSource.Rows.Add(item.MaChuyenXe, item.MaTaiXe, item.NhanVien.HoTen, item.MaBSXe, item.GioKhoiHanh, string.Format("{0:0,0}", item.DonGia));
				}
			}
		}

        /// <summary>
        /// Cap nhat dia diem cho 2 combobox diem bat dau va diem ket thuc
        /// </summary>
        private void LoadDiaDiem()
        {
            var diaDiems = DiaDiemRepository.SelectAll();
            cbxDiemBatDau.Items.Clear();
            cbxDiemKetThuc.Items.Clear();
            foreach (DiaDiem diadiem in diaDiems)
            {
                cbxDiemBatDau.Items.Add(diadiem);
                cbxDiemKetThuc.Items.Add(diadiem);
            }
        }

        private void txtDoDai_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back)
            {
                e.Handled = true;
            }
        }

        private void btnCapNhatChuyenXe_Click(object sender, EventArgs e)
        {
            FrmCapNhatChuyenXe frm = new FrmCapNhatChuyenXe(int.Parse(DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaChuyenXe"].ToString()));
            frm.Handler += GetChuyenXeDaCapNhat;
            frm.ShowDialog();
        }

        public void GetChuyenXeDaCapNhat(object sender, EventArgs e)
        {
            var eventType = (TransferSimpleDataEvent)e;
            string[] comp = eventType.Data.Split(new char[] { '#' });
            // Format: MaChuyenXe#MaTaiXe#TenTaiXe#MaBSXe#GioKhoiHanh#DonGia
            DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaTaiXe"] = comp[0];
            DataSource.Rows[dtgvData.SelectedRows[0].Index]["HoTen"] = comp[1];
            DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaBSXe"] = comp[2];
            DataSource.Rows[dtgvData.SelectedRows[0].Index]["GioKhoiHanh"] = comp[3];
            DataSource.Rows[dtgvData.SelectedRows[0].Index]["DonGia"] = comp[4];
        }

        private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
                return;

            if (!string.Empty.Equals(DataSource.Rows[dtgvData.SelectedRows[0].Index]["MaChuyenXe"].ToString()))
                btnCapNhatChuyenXe.Enabled = true;
            else
                btnCapNhatChuyenXe.Enabled = false;
        }

        private void cbxDiemKetThuc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbxDiemKetThuc.SelectedIndex != -1)
            {
                var dodai = ((DiaDiem)cbxDiemKetThuc.SelectedItem).DoDai;
                txtDoDai.Text = dodai == null ? string.Empty : dodai.Value.ToString();
            }
        }

	}

}
